#include <gl/glew.h>
#include <gl/glut.h>

static int spin=0;

void init()
{
  glewInit();

  glClearColor(0, 0, 0, 0);
  glShadeModel(GL_SMOOTH);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glEnable(GL_DEPTH_TEST);
}

void display()
{
  GLfloat pos[] = { 0,0, 1.5f, 1.0f };

  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glPushMatrix();
  glTranslatef(0, 0, -5.0f);

  glPushMatrix();
  glRotated( (GLdouble)spin, 1.0f, 0, 0);
  glLightfv(GL_LIGHT0, GL_POSITION, pos);
  
  glTranslated(0, 0, 1.5f);
  glDisable(GL_LIGHTING);
  glColor3f(0, 1.0f, 1.0f);

  glutWireCube(0.1);
  glEnable(GL_LIGHTING);
  glPopMatrix();

  glutSolidTorus(0.275f, 0.85f, 8.0f, 15.0f);

  glPopMatrix();
  glFlush();
}

void reshape(int w, int h)
{
  glViewport(0,0, (GLsizei)w, (GLsizei)h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(40.0f, (GLfloat)w/(GLfloat)h, 1.0f, 20.0f);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

void mouse(int btn, int state, int x, int y)
{
  switch(btn)
  {
  case GLUT_LEFT_BUTTON:
    if(state == GLUT_DOWN)
    {
      spin = (spin+30) % 360;
      glutPostRedisplay();
    }
    break;
  default:
    break;
  }
}

int main(int argc, char* argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(500, 500);
  glutInitWindowPosition(100, 100);
  glutCreateWindow(argv[0]);

  init();

  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMouseFunc(mouse);
  glutMainLoop();

  return 0;
}
